package rbm.modelado.soluciones;

import modelado.datos.elementos.Elemento;
import modelado.datos.elementos.ObjetoMochila;
import modelado.soluciones.Solucion;
import modelado.soluciones.SolucionConjuntoImpl;

public class SolucionMochilaImpl extends SolucionConjuntoImpl implements
		SolucionRBM {
	private Integer valor;
	private Integer peso;

	/**
	 * Constructor por defecto
	 */
	public SolucionMochilaImpl() {
		super();
		valor = 0;
		peso = 0;
	}

	/**
	 * Constructor para dos soluciones
	 */
	public SolucionMochilaImpl(Solucion s1, Solucion s2) {
		super(s1, s2);
		SolucionRBM s1m = (SolucionRBM) s1;
		SolucionRBM s2m = (SolucionRBM) s2;
		valor = s1m.getValor() + s2m.getValor();
		peso = s1m.getPeso() + s2m.getPeso();
	}

	/**
	 * Incluir un elemento implica actualizar el valor y el peso.
	 */
	public void addElemento(Elemento e) {
		super.addElemento(e);
		ObjetoMochila e1 = (ObjetoMochila) e;
		valor = valor + e1.getValor() * e1.getNumInstancias();
		peso = peso + e1.getPeso() * e1.getNumInstancias();
	}

	public int hashCode() {
		int a = super.hashCode() + valor.hashCode() * 31 + peso.hashCode() * 31;
		return a;
	}

	public int compareTo(Solucion s) {
		SolucionRBM sm = (SolucionRBM) s;
		Integer v2 = sm.getValor();
		int a = valor.compareTo(v2);
		return a;
	}

	public String toString() {
		String r = "<" + getElementosEnSolucion() + ">, Valor= " + valor
				+ ", Peso= " + peso;
		return r;
	}

	public Solucion clone() {
		SolucionRBM s = new SolucionMochilaImpl();
		Elemento ec;
		for (Elemento e : getConjunto()) {
			ec = e.clone();
			s.addElemento(ec);
		}
		return s;
	}

	public Integer getPeso() {
		return peso;
	}

	public Integer getValor() {
		return valor;
	}
}
